#include <stdio.h>
#include <fcntl.h> // open() / close()
#include <unistd.h> // read() / write()
#include <sys/types.h>  // sszie_t
#include <stdlib.h>

/*
利用系统调用实现love.txt的一个备份love2.txt，并在控制台输出文件内容
1. open()  love.txt  读
2. open()  love2.txt 创建/写
3. while循环， 不断读取love.txt, 写到love2.txt, 写到控制台
4. 关闭文件
*/

int main(int argc, char const *argv[])
{
    // 1. open()  love.txt  读
    int fd_r = open("love.txt", O_RDONLY);
    if (fd_r == -1)
    {
        perror("打开love.txt失败");

        return 1;
    }

    // 2. open()  love2.txt 创建/写
    int fd_w = open("love2.txt", O_CREAT|O_WRONLY|O_APPEND, 0654);
    if (fd_w == -1)
    {
        perror("打开love2.txt失败");
        // 关闭上面打开成功的文件
        close(fd_r);
        return 1;
    }

    // 3. while循环， 不断读取love.txt, 写到love2.txt, 写到控制台
    char buf[100];
    ssize_t read_bytes;

    // 不断的读
    while((read_bytes = read(fd_r, buf, 100)) >0)
    {
        // 写到love2.txt
        write(fd_w, buf, read_bytes);
        // 写到控制台
        write(STDOUT_FILENO, buf, read_bytes);
    }

    // 如果读取失败，提示
    if (read_bytes == -1)
    {
        perror("读取失败");
    }

    // 关闭打开的文件
    // close(fd_r);
    // close(fd_w);
    // _exit(0);  // _exit结束进程，需要手动关闭流

    exit(0); // 可以不用手动关闭我们打开的流 =》 但开发还是会先手动关闭流


    // return 0;
}
